﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/problem/224938
/*
题目描述：
链接：https://ac.nowcoder.com/acm/problem/224938
来源：牛客网

小红拿到了一个长度为
𝑛

n  的数组。她每次操作可以让某个数加 1 或者某个数减 1 。
小红最多能进行
𝑘

k  次操作。她希望操作结束后，该数组出现次数最多的元素次数尽可能多。
你能求出这个最大的次数吗？
输入描述:
第一行两个正整数
𝑛

n  和
𝑘

k
第二行有
𝑛

n  个正整数
𝑎
𝑖

a
i
​


1
≤
𝑛
≤
1
0
5
1≤n≤10
5

1
≤
𝑘
≤
1
0
12
1≤k≤10
12

1
≤
𝑎
𝑖
≤
1
0
9
1≤a
i
​
 ≤10
9

输出描述:
不超过
𝑘

k  次操作之后，数组中可能出现最多次数元素的次数。
示例1
输入
复制
5 3
6 3 20 8 1
输出
复制
2
说明
共 3 次操作如下：
第一个数加一。
第二个数加一。
第四个数减一。
数组变成了 7 4 20 7 1 ，共有 2 个相同的数： 7 。
可以证明， 2 为最优解。另外，此上操作并不是唯一的操作。
*/

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 解题思路：
// 1、尽可能选择一些爱的比较近的数，让他们变成相同的数(先排序)
// 2、枚举所有的区间，找出区间内所有的数变成相同的数字的最小代价cost<=k
//          数学问题：数轴上有一些点，选取一个位置，是所有的点到它的距离之和最小
//          结论：选择最中间的点
// 可以用前缀和优化求最小代价
// 3、如何求一个区间的最小代价cost
// 4、使用滑动窗口优化枚举区间
int n = 0;
long long k = 0;
const int N = 1e5 + 10;
int nums[N];
long long pre[N]; // 前缀和
int ret = 0;

long long cal(int left, int right) {
    int mid = (left + right) >> 1;
    return ((mid - 1 - left + 1) - (right - (mid + 1) + 1)) * nums[mid] - (pre[mid - 1] - pre[left - 1]) + (pre[right] - pre[mid + 1 - 1]);
}

int main() {
    scanf("%d%lld", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &nums[i]);
    }
    // 先排序
    sort(nums + 1, nums + n + 1);
    for (int i = 1; i <= n; i++) {
        pre[i] = pre[i - 1] + nums[i];
    }
    for (int left = 1, right = 1; right <= n; right++) {
        long long cost = cal(left, right);
        while (cost > k) {
            left++;
            cost = cal(left, right);
        }
        ret = max(ret, right - left + 1);
    }
    printf("%d\n", ret);
    return 0;
}